home *** CD-ROM | disk | FTP | other *** search
- ;**************************************************
- ; “THis”ファイル検索 V1.0d
- ;
- ;V1.0 92/05/13 18:35:34 ~ 92/05/14 00:17:08 (完成版)
- ;V1.0a 92/05/27 13:21:43 ~ 92/05/27 13:48:50 (ワイルドカード省略をサポート)
- ;V1.0b 92/06/06 14:04:57 ~ 92/06/06 14:18:28 (総検索数の表示)
- ;V1.0c 92/06/06 14:20:51 ~ 92/06/06 14:23:25 (隠し・システムファイル勘定)
- ;V1.0d 92/06/10 ~ 92/06/10 (PUT16BIT修正)
- ;**************************************************
-
- IDEAL
- DOSSEG
- P8086
- JUMPS
-
- CR EQU 0DH,0AH
- NULL EQU 00H
-
- SEGMENT CODE "CODE"
- ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
-
- ORG 80H
- DTA:
- ORG 100H
-
- ;****************************************
- ; 初期ルーチン
- ;
- ;
- ;****************************************
-
- ENTRY:
- CLD
-
- MOV DI,OFFSET RETURN
- CALL ASCIIZPUTS ;改行しておく
-
- MOV AX,CS
- MOV DS,AX
- MOV ES,AX ;セグメント合わせ
-
- CALL GETCMD ;コマンドラインを読み取る
-
- CMP DX,0FFFFH
- JNE PIN ;ファイル名とおぼしきものがあったら
-
- MOV DX,OFFSET DIR
- PIN:
- CALL WAKERU
-
- MAIN:
- MOV BX,OFFSET RNDBUF ;バッファ位置指定
- CALL SIR ;検索本体へ
-
- CMP [WORD LOOKFOR],00H
- JE NOFILE
-
- CALL E_PUTS
-
- MOV AL,0 ;正常終了
-
- ;****************************************
- ; 終了ルーチン
- ;****************************************
- FIN:
- MOV AH,4CH
- INT 21H ;終わり
-
- ;****************************************
- ; ファイルが無い時のメッセージ
- ;****************************************
- NOFILE:
- MOV AH,09H
- MOV DX,OFFSET NOF_MES
- INT 21H ;メッセージ表示
-
- MOV AL,1
- JMP FIN ;終わり
-
- ;****************************************
- ; コマンドライン読み取り
- ;
- ;IN COMMAND LINE
- ;OUT DX,CMDPOINTER,COMMAND LINE
- ;BREAK BX,SI,DI,BP
- ;****************************************
- PROC GETCMD
-
- MOV SI,81H ;移し元ポインタ(双方とも、)
- XOR BP,BP ;ポインタのポインタ
- JMP GETCMD4
-
- GETCMDP:
- MOV [WORD CMDPOINTER+BP],SI
- INC BP
- INC BP ;ポインタ設定
- GETCMD2:
- CMP [BYTE SI],0DH
- JE GETCMD5 ;最後の処理へ
-
- CMP [BYTE SI],20H
- JE GETCMD3 ;飛ばし処理へ
-
- INC SI
-
- JMP GETCMD2
-
- GETCMD3:
- MOV [BYTE SI],00H
- INC SI ;まずヌル入れ
- GETCMD4:
- CMP [BYTE SI],0DH
- JE GETCMD5 ;最後の処理へ
- CMP [BYTE SI],20H
- JNE GETCMDP ;スペースじゃなかったら帰る
-
- INC SI
- JMP GETCMD4 ;スペースだったら移動してまた調べる
-
- GETCMD5:
- MOV [BYTE SI],00H ;埋め込んで終わり
-
- XOR BX,BX
- MOV DX,0FFFFH ;書いていない時の為
- READCMD:
- CMP BP,BX
- JE READEND ;EndOfCMD
-
- MOV DI,[WORD CMDPOINTER+BX]
- CMP [BYTE DI],"-"
- JE OP_READ
- CMP [BYTE DI],"/"
- JE OP_READ ;各々オプションの読み取りへ
-
- MOV DX,DI ;ファイル名と判断する
-
- COMEREAD:
- INC BX
- INC BX
- JMP READCMD ;ポインタ移動して終了
-
- OP_READ:
- JMP COMEREAD ;現行、オプション無し
-
- READEND:
- RET
-
- ENDP GETCMD
-
-
- ;****************************************
- ; 検索本体
- ;
- ;IN NOWPATH DIRECTORY
- ;OUT
- ;BREAK
- ;****************************************
- PROC SIR
-
- MOV SI,OFFSET NOWPATH
- MOV DI,OFFSET SIRPATH
- CALL STRCPY ;コピー
-
- MOV SI,OFFSET SIRPATH
- MOV DI,OFFSET WILD
- CALL STRCAT ;パスを作る
-
- MOV AH,4EH
- MOV DX,OFFSET SIRPATH
- MOV CX,06H
- INT 21H ;それを検索
-
- JC DIRE ;無かったら下位ディレクトリ検査
- JMP FS_PUTS ;次のループへ、途中から参入
-
- FS_LOOP:
- MOV AH,4FH
- INT 21H ;続きの検索
-
- JC DIRE ;他に無かったら下位ディレクトリ検査
-
- FS_PUTS:
- MOV DI,OFFSET NOWPATH
- CALL ASCIIZPUTS ;パス名
- MOV DI,OFFSET DTA+1EH
- CALL ASCIIZPUTS ;ファイル名
- MOV DI,OFFSET RETURN
- CALL ASCIIZPUTS ;改行、を出力する
-
- INC [WORD LOOKFOR] ;チェック
-
- JMP FS_LOOP ;戻る
-
- DIRE:
- MOV SI,OFFSET NOWPATH
- MOV DI,OFFSET SIRPATH
- CALL STRCPY ;コピー
-
- MOV SI,OFFSET SIRPATH
- MOV DI,OFFSET DIR
- CALL STRCAT ;パスを作る
-
- MOV AH,4EH
- MOV DX,OFFSET SIRPATH
- MOV CX,16H
- INT 21H ;今度はディレクトリ
-
- JC SIRRET ;無かったら退散
-
- PUSH BX ;保存
- JMP SIR2
-
- SIR1:
- MOV AH,4FH
- INT 21H ;続
-
- JC SIR3 ;他に無かったら移る準備
-
- SIR2:
- INC [WORD COUNT] ;仮カウント
-
- CMP [BYTE DTA+15H],10H
- JNE SIR1 ;ディレクトリか否か
-
- DEC [WORD COUNT] ;ディレクトリだったらチャイ
-
- MOV DI,BX ;汎用バッファの終点をBXにしている
- MOV SI,OFFSET DTA+1EH
- CALL STRCPY
- MOV BX,DI ;発見したディレクトリをバッファにコピー
-
- JMP SIR1 ;戻る
-
- SIR3:
- MOV [BYTE BX],NULL
- INC BX ;バッファの最終位置ポインタ
- POP BP ;サブディレクトリバッファの最初
-
- NEST:
- CMP [BYTE BP],NULL
- JE SIRRET ;終了サイン
- CMP [BYTE BP],"."
- JE COME ;抜かし
-
- MOV DI,BP
- MOV BP,OFFSET NOWPATH
- CALL STRLEN
- PUSH BP ;前のパスを復元するための準備
- MOV BP,DI ;この辺は汚いが、稼働している
-
- MOV SI,OFFSET NOWPATH
- MOV DI,BP
- CALL STRCAT ;パスを作る(上パスのみ)
- MOV SI,OFFSET NOWPATH
- MOV DI,OFFSET YEN
- CALL STRCAT ;パスを作る(¥)
-
- PUSH BP ;調べているディレクトリを保存
- PUSH BX ;サブルーチン用汎用バッファの保存
- CALL SIR ;自分を呼んでいる
- POP BX ;その復元
- POP BP
-
- POP DI ;作ったパスの分解
- MOV [BYTE DI],NULL ;前のパスを復元
-
- COME:
- CALL STRLEN
- INC BP ;次のディレクトリに移る
- JMP NEST ;戻る
-
- SIRRET:
- RET
-
- ENDP
-
- ;***********************************************
- ; 終了メッセージの表示
- ; in : [WORD LOOKFOR]
- ; out : CONSOLE
- ; break : ?
- ; call : PUT16BIT
- ;***********************************************
- PROC E_PUTS
-
- MOV AH,09H
- MOV DX,OFFSET E_MES1
- INT 21H
-
- MOV CX,[WORD COUNT]
- CALL PUT16BIT
-
- MOV AH,09H
- MOV DX,OFFSET E_MES2
- INT 21H
-
- MOV CX,[WORD LOOKFOR]
- CALL PUT16BIT
-
- MOV AH,09H
- MOV DX,OFFSET E_MES3
- INT 21H
-
- RET
-
- ENDP
-
- ;***********************************************
- ; パスとワイルドカードに分離
- ; in : COMMAND LINE,DX
- ; out : [DS:WILD]~,[NOWLINE]~
- ; break : ?
- ; call : None
- ;***********************************************
- PROC WAKERU
-
- MOV BP,DX
- MOV SI,0FFFFH
- @@_1:
- CMP [BYTE BP],"\"
- JE @@_2
- CMP [BYTE BP],":"
- JE @@_2
- CMP [BYTE BP],NULL
- JE @@_3
- INC BP
- JMP @@_1
-
- @@_2:
- MOV SI,BP
- INC BP
- JMP @@_1
-
- @@_3:
- CMP SI,0FFFFH
- JE @@_4
-
- PUSH SI
- CMP [BYTE SI],":"
- JE @@_5
- MOV [BYTE SI],NULL
- MOV SI,DX
- MOV DI,OFFSET NOWPATH
- CALL STRCPY
- MOV SI,OFFSET NOWPATH
- MOV DI,OFFSET YEN
- CALL STRCAT ;パスを作る(¥)
- @@_COME:
- POP SI
- INC SI
-
- CMP [BYTE SI],NULL
- JNE @@_COME2
-
- MOV SI,OFFSET DIR
- @@_COME2:
- MOV DI,OFFSET WILD
- CALL STRCPY
-
- JMP @@_RET
-
- @@_4:
- MOV [BYTE NOWPATH],NULL
- MOV SI,DX
- MOV DI,OFFSET WILD
- CALL STRCPY
-
- @@_RET:
- RET
-
- @@_5:
- MOV AL,[BYTE SI-1]
- MOV [BYTE NOWPATH],AL
- MOV [BYTE NOWPATH+1],":"
- MOV [BYTE NOWPATH+2],NULL
-
- JMP @@_COME
-
- ENDP
-
- ;***********************************************
- ; ストリングのコピー
- ; in : [DS:SI]~
- ; out : [ES:DI]~
- ; break : AL
- ; call : NO
- ;***********************************************
- PROC STRCPY
- STRCPY1:
- LODSB
- STOSB
- CMP AL,00H
- JNE STRCPY1
- STRCPY2:
- RET
-
- ENDP
-
- ;***********************************************
- ; ストリングの接続
- ; in : ES,DI,DS,SI
- ; out : [ES:DI]~,[DS:SI]~
- ; break : AL
- ; call : NO
- ;***********************************************
- PROC STRCAT
-
- STRCAT1:
- LODSB
- CMP AL,00H
- JNE STRCAT1
-
- MOV AX,SI
- MOV SI,DI
- MOV DI,AX
- DEC DI ;オーバーラン
- STRCAT2:
- LODSB
- STOSB
- CMP AL,00H
- JNE STRCAT2
-
- RET
-
- ENDP
-
- ;***********************************************
- ; 文字列の表示
- ; in : [DS:DI]~
- ; out : CONSOLE,BP
- ; break :
- ; call :
- ;***********************************************
- PROC ASCIIZPUTS
- XOR BP,BP
- MOV AH,02
- ASCIIZPUTS2:
- CMP [BYTE DS:DI+BP],00H
- JE ASCIIZPUTS_END
- MOV DL,[BYTE DS:DI+BP]
- INT 21H
- INC BP
- JMP ASCIIZPUTS2
- ASCIIZPUTS_END:
- RET
-
- ENDP
-
- ;***********************************************
- ; 文字列の最後の場所に移動
- ; in : BP
- ; out :
- ; break :
- ; call : NO
- ;***********************************************
- PROC STRLEN
-
- STRLEN2:
- CMP [BYTE DS:BP],00H
- JE STRLEN_END
- INC BP
- JMP STRLEN2
- STRLEN_END:
- RET ;このサブルーチンの名前は関係ない
- ENDP
-
-
- ;////////////////////
- ; 16ビット自然数の書き出し
- ;
- ; CXを書く
- ;
- ; AX、BX、CX、DXが壊れる
- ;////////////////////
- PROC PUT16BIT
-
- XOR BP,BP
- @@_1:
- MOV AX,CX
- XOR DX,DX
- MOV BX,10000
- DIV BX
- MOV BL,AL
- CMP AL,0
- JE @@_2
- INC BP
- @@_2:
- CMP BP,0
- JE @@_2B
- ADD AL,30H
- MOV DL,AL
- MOV AH,02H
- INT 21H
- XOR DX,DX
- XOR AH,AH ;BUG FIXED 92/06/10
- @@_2B:
- MOV AL,BL
- MOV BX,10000
- MUL BX
- SUB CX,AX
-
- MOV AX,CX
- MOV BX,1000
- DIV BX
- MOV BL,AL
- CMP AL,0
- JE @@_3
- INC BP
- @@_3:
- CMP BP,0
- JE @@_3B
- ADD AL,30H
- MOV DL,AL
- MOV AH,02H
- INT 21H
- XOR DX,DX
- XOR AH,AH ;BUG FIXED 92/06/10
- @@_3B:
- MOV AL,BL
- MOV BX,1000
- MUL BX
- SUB CX,AX
-
- MOV AX,CX
- MOV BX,100
- DIV BX
- MOV BL,AL
- CMP AL,0
- JE @@_4
- INC BP
- @@_4:
- CMP BP,0
- JE @@_4B
- ADD AL,30H
- MOV DL,AL
- MOV AH,02H
- INT 21H
- XOR DX,DX
- XOR AH,AH ;BUG FIXED 92/06/10
- @@_4B:
- MOV AL,BL
- MOV BX,100
- MUL BX
- SUB CX,AX
-
- MOV AX,CX
- MOV BX,10
- DIV BX
- MOV BL,AL
- CMP AL,0
- JE @@_5
- INC BP
- @@_5:
- CMP BP,0
- JE @@_5B
- ADD AL,30H
- MOV DL,AL
- MOV AH,02H
- INT 21H
- XOR DX,DX
- XOR AH,AH ;BUG FIXED 92/06/10
- @@_5B:
- MOV AL,BL
- MOV BX,10
- MUL BX
- SUB CX,AX
-
- MOV AX,CX
- ADD AL,30H
- MOV DL,AL
- MOV AH,02H
- INT 21H
- XOR DX,DX
-
- RET ;冗長…
-
- ENDP
-
- ;****************************************
- ; 初期化済データ部
- ;****************************************
- NOF_MES:
- DB " 該当ファイルが有りません。",CR,"$"
- YEN:
- DB "\",NULL ;パスの区切り
- RETURN:
- DB CR,NULL ;改行
- DIR:
- DB "*.*",NULL ;ディレクトリ検索用
- LOOKFOR:
- DW 00H
- E_MES1:
- DB CR," 該当ファイルは","$"
- E_MES2:
- DB "個中","$"
- E_MES3:
- DB "個です。",CR,"$"
- COUNT:
- DW 0
-
- ;****************************************
- ; 非初期化データ部
- ;****************************************
-
- CMDPOINTER:
- DW 64 DUP(?) ;コマンドラインポインタ
-
- WILD:
- DB 80H DUP(?) ;ワイルドカード?
-
- NOWPATH:
- DB 80H DUP(?) ;検索中のディレクトリ
-
- SIRPATH:
- DB 80H DUP(?) ;検索時のワイルドカード用テンポラリ
-
- RNDBUF:
- ;はみ出るチェックはしていない。スタックとの衝突
- ;で、事実上、処理オーバーとなる(いい加減?)。
- ENDS CODE
- END ENTRY